<?php
class Hooks {

	private static $handlers = array();
	private static $__instance = null;
	
	/**
	 * 
	 * private的构造函数，单例模式
	 */
	private function __construct()
	{
		self::$handlers = array(
			
		);
	}
	
	/**
	 * 
	 * 获取Hook对象，单例模式。
	 */
	public function getInstance()
	{
		if(!self::$__instance)
			self::$__instance = new self();
		return self::$__instance;
	}
	/**
	 * 把一个函数注册到钩子上。
	 *
	 * @param $name Mixed: 钩子的名字
	 * @param $callback Mixed: 要注册的callback函数
	 * @return void
	 */
	public function register( $name, $callback ) {
		if( !isset( self::$handlers[$name] ) ) {
			self::$handlers[$name] = array();
		}
		if(!in_array($callback, self::$handlers[$name]))
		{
			self::$handlers[$name][] = $callback;
		}
	}	
	
	/**
	 * 一个钩子是否有注册事件
	 *
	 * @param $name Mixed: 钩子的名称（id）
	 * @return Boolean: 如果有事件注册，返回true
	 */
	public function isRegistered( $name ) {
		if( !isset( self::$handlers[$name] ) ) {
			self::$handlers[$name] = array();
		}

		return ( count( self::$handlers[$name] ) != 0 );
	}
	
	/**
	 * 返回一个钩子绑定的所有事件
	 *
	 * @param $name Mixed: name of the hook
	 * @return array
	 */
	public function getHandlers( $name ) {
		if( !isset( self::$handlers[$name] ) ) {
			return array();
		}

		return self::$handlers[$name];
	}
	
	/**
	 * 
	 * 调用钩子，需要放在各个事件触发的地方。
	 * @param string $event
	 * @param array $args
	 */
	public function run( $event, $args = array() ) {
		if ( !is_array( self::$handlers ) ) {
			return false;//钩子配置的事件数组出错
		}
		if ( !isset( self::$handlers[$event] )) {
			return true;
		}
		
		$hooks = self::$handlers[$event];
		if(empty($hooks))
		{
			return true;
		}
		foreach ($hooks as $func)
		{
			//TODO  增加 function_exists验证
			//TODO  增加支持调用类的静态方法功能。
			call_user_func_array($func,$args);
		}
	}
}